package com.demo;

public class Demo {

	/**
	 * 位与运算，都为1时，才为1，其余情况为0
	 * 
	 * @param a
	 * @param b
	 * @return
	 * @author laiguiliang 2018/12/07
	 */
	private static int numAndNum(int a, int b) {
		return a & b;
	}

	/**
	 * 位或运算,，只要有1是，就是1，其余情况为0
	 * 
	 * @param a
	 * @param b
	 * @return
	 * @author laiguiliang 2018/12/07
	 */
	private static int numOrNum(int a, int b) {
		return a | b;
	}
	
	/**
	 * 位异或运算,，只要位不同,就为1，其余情况为0
	 * 
	 * @param a
	 * @param b
	 * @return
	 * @author laiguiliang 2018/12/07
	 */
	private static int numDiffOrNum(int a, int b) {
		return a ^ b;
	}

	public static void main(String[] args) {

		int a = 3;// 011
		int b = 6;// 110
		System.out.println(Integer.toBinaryString(3));
		System.out.println(Integer.toBinaryString(6));

		System.out.println(numAndNum(a, b));//10
		System.out.println(numOrNum(a, b));//111
		System.out.println(numDiffOrNum(a, b));//101
		
		
		System.out.println(String.valueOf(toBinary(129)));

		// 负数在计算机中是用补码的形式存储的，正数在计算机中是用原码的形式存储的。
		// 正数求原码直接将十进制转二进制即可，负数的补码是在原码的基础上除符号位外其余位取反后+1
		// System.out.println(-7 & 5);
		//
		// System.out.println(Integer.toBinaryString(7));// 00000000 00000000 00000000 00000010 对应绝对值的原码
		// System.out.println(Integer.toBinaryString(-7));// 00000000 00000000 00000000 00000010 对应绝对值的原码
		// System.out.println(Integer.toBinaryString(2));// 01111111 11111111 11111111 11111101 除符号位外，其余取反
		// System.out.println(Integer.toBinaryString(2));// 01111111 11111111 11111111 11111110 再 +1
		// System.out.println(Integer.toBinaryString(-2));//11111111 11111111 11111111 11111110 带上符号
		// System.out.println(Integer.toBinaryString(5));
		// -7:1111 1001
		// 5:0000 0101
		// 0000 0001

		// -7--->原码：0000 0111--->原码除符号位外，全部取反--->1111 1000--->+1：1111 1001
		// 步骤1、对应原码 步骤2、除符号位外，全部取反 步骤3、+1

		// 绝对值的原码，除符号位外，全部取反后，再 +1
		int arr[] = new int[32];
		a = 129;
		a = Math.abs(a);
		int i = 31;
		while (a != 0) {
			arr[i] = a % 2;
			i--;
			a /= 2;
		}

		System.out.println(String.valueOf(arr));
	}

	private static int[] toBinary(int num) {
		int arr[] = new int[32];
		num = Math.abs(num);
		int i = 31;
		while (num != 0) {
			arr[i] = num % 2;
			i--;
			num /= 2;
		}
		System.out.println(String.valueOf(arr));
		return arr;
	}

}

// X0 100000111
// X1 011111001

// 1011111001
// 1011111001
